#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if.h>
#include <arpa/inet.h>

#include "raw_ethernet.h"

int main(int argc, char *argv[]) {
	// 1. 检查参数是否正确
	if (argc != 2) {
		fprintf(stderr, "Usage: %s <interface>\n", argv[0]);
		return EXIT_FAILURE;
	}

	// 2. 创建 RAW Socket
	int sock = socket(AF_PACKET, SOCK_RAW, htons(CUSTOM_ETHERTYPE));
	if (sock < 0) {
		perror("socket");
		return EXIT_FAILURE;
	}

	// 3. 绑定到指定接口
	struct ifreq ifr;
	strncpy(ifr.ifr_name, argv[1], IFNAMSIZ-1);
	if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0) {
		perror("setsockopt(SO_BINDTODEVICE)");
		close(sock);
		return EXIT_FAILURE;
	}

	// 4. 接收原始帧并打印 EtherType
	printf("Listening on interface: %s\n", argv[1]);
	while (1) {
		uint8_t buffer[1500];
		ssize_t len = recvfrom(sock, buffer, sizeof(buffer), 0, NULL, NULL);
		if (len < 0) {
			perror("recvfrom");
			close(sock);
			return EXIT_FAILURE;
		}

		// 解析以太网帧头（前 14 字节）
		struct ethhdr *eth = (struct ethhdr *)buffer;
		uint16_t ether_type = ntohs(eth->h_proto);

		printf("Received frame | EtherType: 0x%04X | Frame length: %zd bytes\n", ether_type, len);

		// 打印前 16 字节（可选）
		printf("First 16 bytes: ");
		for (int i = 0; i < 16 && i < len; i++) {
			printf("%02X ", buffer[i]);
		}
		printf("\n\n");

		// 如果你想捕获特定 EtherType，可以在这里检查：
		// if (ether_type == 0x88B5) {
		//     // 自定义逻辑
		// }
	}

	close(sock);
	return EXIT_SUCCESS;
}

